# 运算符
"""
Python语言支持以下类型的运算符:
    算术运算符
    比较（关系）运算符
    赋值运算符
    逻辑运算符
    位运算符
    成员运算符
    身份运算符
    运算符优先级
"""

# Python算术运算符
print('#' * 15 + 'Python算术运算符' + '#' * 15)
"""
以下假设变量a为10，变量b为21
运算符             描述                                              实例
+       加 - 两个对象相加                                    a + b 输出结果 31
-       减 - 得到负数或是一个数减去另一个数                   a - b 输出结果 -11
*       乘 - 两个数相乘或是返回一个被重复若干次的字符串        a * b 输出结果 210
/       除 - x 除以 y                                        b / a 输出结果 2.1
%       取模 - 返回除法的余数                                b % a 输出结果 1
**      幂 - 返回x的y次幂                                    a**b 为10的21次方
//      取整除 - 向下取接近商的整数                           9//2 = 4    -9//2 =-5
"""
a, b = 12, 5
print('a + b =', a+b)
print('a - b =', a-b)
print('a * b =', a*b)
print('a % b =', a/b)
print('a // b =', a//b)
print('a ** b =', a**b)
print('a // b =', a//b)


# Python比较运算符
print('#' * 15 + 'Python比较运算符' + '#' * 15)
"""
以下假设变量a为10，变量b为20：
运算符                 描述	                                                实例
==      等于 - 比较对象是否相等                                  (a == b) 返回 False。
!=      不等于 - 比较两个对象是否不相等                           (a != b) 返回 True。
>       大于 - 返回x是否大于y                                    (a > b) 返回 False。
<       小于 - 返回x是否小于y。所有比较运算符返回1表示真，
        返回0表示假。这分别与特殊的变量True和False等价。
        注意，这些变量名的大写。                                 (a < b) 返回 True。
>=      大于等于 - 返回x是否大于等于y。                          (a >= b) 返回 False。
<=      小于等于 - 返回x是否小于等于y。                          (a <= b) 返回 True。
"""
a, b = 10, 20
print('(a == b) =', a == b)
print('(a != b)=', a != b)
print('(a > b) =', a > b)
print('(a < b) =', a < b)
print('(a >= b) =', a >= b)
print('(a <= b) =', a <= b)

# Python赋值运算符
print('#' * 15 + 'Python赋值运算符' + '#' * 15)
"""
以下假设变量a为10，变量b为20：
运算符         描述	                       实例
=       简单的赋值运算符        c = a + b 将 a + b 的运算结果赋值为 c
+=      加法赋值运算符          c += a 等效于 c = c + a
-=      减法赋值运算符          c -= a 等效于 c = c - a
*=      乘法赋值运算符          c *= a 等效于 c = c * a
/=      除法赋值运算符          c /= a 等效于 c = c / a
%=      取模赋值运算符          c %= a 等效于 c = c % a
**=     幂赋值运算符            c **= a 等效于 c = c ** a
//=     取整除赋值运算符        c //= a 等效于 c = c // a


:=      海象运算符，可在表达式内部为变量赋值。 Python3.8 版本新增运算符。	
在这个示例中，赋值表达式可以避免调用 len() 两次:
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
Python 3.8以下写法：
n = len(a)
if n > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
"""
a, b = 21, 10
c = a + b
print('c = a + b , c=', c)
c += a
print('c += a , c=', c)
c *= a
print('c *= a  , c=', c)
c /= a
print('c /= a , c=', c)
c %= a
print('c %= a  , c=', c)
c = 2
c **= a
print('c **= a  , c=', c)
c //= a
print('c //= a  , c=', c)


# Python位运算符
print('#' * 15 + 'Python位运算符' + '#' * 15)
"""
按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下：
下表中变量 a 为 60，b 为 13二进制格式如下：
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a  = 1100 001
运算符         描述	                                                        实例
&       按位与运算符：参与运算的两个值,如果两个相应位都为1,
        则该位的结果为1,否则为0	                            (a & b) 输出结果 12 ，二进制解释： 0000 1100
|       按位或运算符：只要对应的二个二进位有一个为1时，
        结果位就为1。	                                    (a | b) 输出结果 61 ，二进制解释： 0011 1101
^       按位异或运算符：当两对应的二进位相异时，结果为1	    (a ^ b) 输出结果 49 ，二进制解释： 0011 0001
~       按位取反运算符：对数据的每个二进制位取反,即把1变为0,
        把0变为1。                                           ~x 类似于 -x-1	(~a ) 输出结果 -61 ，
                                                            二进制解释： 1100 0011， 在一个有符号二进制数的补码形式。
<<      左移动运算符：运算数的各二进位全部左移若干位，
        由"<<"右边的数指定移动的位数，高位丢弃，低位补0。	    a << 2 输出结果 240 ，二进制解释： 1111 0000
>>      右移动运算符：把">>"左边的运算数的各二进位全部
        右移若干位，">>"右边的数指定移动的位数	                a >> 2 输出结果 15 ，二进制解释： 0000 1111
"""
a = 60  # 60 = 0011 1100
b = 13  # 13 = 0000 1101
print('a & b =', a & b)  # 12 = 0000 1100
print('a | b =', a | b)  # 61 = 0011 1101
print('a ^ b =', a ^ b)  # 49 = 0011 0001
print('~a =', ~a)  # -61 = 1100 0011
print('a << 2 =', a << 2)  # 240 = 1111 0000
print('a >> 2 =', a >> 2)  # 15 = 0000 1111


# Python逻辑运算符
print('#' * 15 + 'Python逻辑运算符' + '#' * 15)
"""
Python语言支持逻辑运算符，以下假设变量 a 为 10, b为 20:

运算符	逻辑表达式	                        描述	                                                     实例
and     x and y     布尔"与" - 如果 x 为 False，x and y 返回 False，否则它返回 y 的计算值。	    (a and b) 返回 20。
or      x or y      布尔"或" - 如果 x 是 True，它返回 x 的值，否则它返回 y 的计算值。	            (a or b) 返回 10。
not     not x       布尔"非" - 如果 x 为 True，返回 False 。如果 x 为 False，它返回 True。        not(a and b) 返回 False
"""
a, b = 10, 20
print('a and b =', a and b)
print(' a or b =', a or b)
print('not (a and b) =', not (a and b))


# Python成员运算符
print('#' * 15 + 'Python成员运算符' + '#' * 15)
"""
除了以上的一些运算符之外，Python还支持成员运算符，测试实例中包含了一系列的成员，包括字符串，列表或元组。
运算符	                        描述                                  	            实例
in          如果在指定的序列中找到值返回 True，否则返回 False。	    x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in      如果在指定的序列中没有找到值返回 True，否则返回 False。	x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
"""
a, b, c = 10, 20, 2
test_list = [1, 2, 3, 4, 5]
print('a in test_list =', a in test_list)
print('b not in test_list =', b not in test_list)
print('c in test_list =', c in test_list)


# Python身份运算符
print('#' * 15 + 'Python身份运算符' + '#' * 15)
"""
身份运算符用于比较两个对象的存储单元
运算符	                    描述                                                  	实例
is          is 是判断两个标识符是不是引用自一个对象	    x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True，否则返回 False
is not      is not 是判断两个标识符是不是引用自不同对象	x is not y ， 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True，否则返回 False。
注1： id() 函数用于获取对象内存地址。
注2： is 与 == 区别：is 用于判断两个变量引用对象是否为同一个， == 用于判断引用变量的值是否相等。
"""
a, b = 20, 20
print('a is b =', a is b)
print('id(a) == id(b) =', id(a) == id(b))
print('id(a) is id(b) =', id(a) is id(b))
print('a is not b =', a is not b)


# Python运算符优先级
print('#' * 15 + 'Python运算符优先级' + '#' * 15)
"""
以下列出了从最高到最低优先级的所有运算符：

运算符	                        描述
**                          指数 (最高优先级)
~ + -                       按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % //                    乘，除，求余数和取整除
+ -                         加法减法
>> <<                       右移，左移运算符
&                           位 'AND'
^ |                         位运算符
<= < > >=                   比较运算符
== !=                       等于运算符
= %= /= //= -= += *= **=	赋值运算符
is is not	                身份运算符
in not in	                成员运算符
not and or	                逻辑运算符(not>and>or)
"""
a = 20
b = 10
c = 15
d = 5
e = (a + b) * c / d  # ( 30 * 15 ) / 5
print("(a + b) * c / d 运算结果为：", e)
e = ((a + b) * c) / d  # (30 * 15 ) / 5
print("((a + b) * c) / d 运算结果为：", e)
e = (a + b) * (c / d)  # (30) * (15/5)
print("(a + b) * (c / d) 运算结果为：", e)
e = a + (b * c) / d  # 20 + (150/5)
print("a + (b * c) / d 运算结果为：", e)

print(True or False and False)  # =>True
print(1 and 0 or not False)  # =>True
print(not False or 1 and 0)  # =>True
print(1 or not True and 0)   # =>1


# 注意：Python3 已不支持 <> 运算符，可以使用 != 代替，如果你一定要使用这种比较运算符，可以使用以下的方式：
# >>> from __future__ import barry_as_FLUFL
# >>> 1 <> 2
# True
